package com.teacher.game.framework.animation;

/**
 * UI动画工厂类
 * 
 * 提供常用的UI动画预设和创建方法，简化动画的使用。
 * 包含淡入淡出、滑动、缩放、弹跳、脉冲等常见UI动画效果。
 * 
 * 支持的动画类型：
 * - 淡入淡出：fadeIn、fadeOut
 * - 滑动：slideIn、slideOut（支持4个方向）
 * - 缩放：scaleIn、scaleOut、pulse
 * - 弹跳：bounce、shake
 * - 旋转：rotate、spin
 * - 组合动画：弹出菜单、按钮点击反馈等
 * 
 * 使用示例：
 * <pre>
 * // 淡入动画
 * UIAnimator fadeIn = UIAnimations.fadeIn(button, 1.0f);
 * 
 * // 从左侧滑入
 * UIAnimator slideIn = UIAnimations.slideInFromLeft(menu, 200f, 0.8f);
 * 
 * // 脉冲效果
 * UIAnimator pulse = UIAnimations.pulse(icon, 1.2f, 1.0f);
 * </pre>
 * 
 * @version 1.0
 * @since 2025-09-12
 */
public class UIAnimations {
    
    // 标准动画持续时间常量
    public static final float DURATION_SHORT = 0.2f;   // 短动画 - 200ms
    public static final float DURATION_MEDIUM = 0.5f;  // 中等动画 - 500ms  
    public static final float DURATION_LONG = 1.0f;    // 长动画 - 1000ms
    
    /**
     * 私有构造函数，防止实例化
     */
    private UIAnimations() {}
    
    // ==================== 淡入淡出动画 ====================
    
    /**
     * 创建淡入动画
     * 
     * @param target 动画目标
     * @param duration 持续时间（秒）
     * @return UI动画器
     */
    public static UIAnimator fadeIn(UIAnimatable target, float duration) {
        return new UIAnimator(target)
            .animate("alpha", 0f, 1f, duration, Tween.EASE_OUT);
    }
    
    /**
     * 创建淡出动画
     * 
     * @param target 动画目标
     * @param duration 持续时间（秒）
     * @return UI动画器
     */
    public static UIAnimator fadeOut(UIAnimatable target, float duration) {
        return new UIAnimator(target)
            .animate("alpha", 1f, 0f, duration, Tween.EASE_IN);
    }
    
    /**
     * 创建快速淡入动画
     */
    public static UIAnimator fadeInFast(UIAnimatable target) {
        return fadeIn(target, DURATION_SHORT);
    }
    
    /**
     * 创建快速淡出动画
     */
    public static UIAnimator fadeOutFast(UIAnimatable target) {
        return fadeOut(target, DURATION_SHORT);
    }
    
    // ==================== 滑动动画 ====================
    
    /**
     * 从左侧滑入
     * 
     * @param target 动画目标
     * @param distance 滑动距离
     * @param duration 持续时间（秒）
     * @return UI动画器
     */
    public static UIAnimator slideInFromLeft(UIAnimatable target, float distance, float duration) {
        float currentX = target.getAnimatedValue("x");
        return new UIAnimator(target)
            .animate("x", currentX - distance, currentX, duration, Tween.EASE_OUT);
    }
    
    /**
     * 从右侧滑入
     */
    public static UIAnimator slideInFromRight(UIAnimatable target, float distance, float duration) {
        float currentX = target.getAnimatedValue("x");
        return new UIAnimator(target)
            .animate("x", currentX + distance, currentX, duration, Tween.EASE_OUT);
    }
    
    /**
     * 从上方滑入
     */
    public static UIAnimator slideInFromTop(UIAnimatable target, float distance, float duration) {
        float currentY = target.getAnimatedValue("y");
        return new UIAnimator(target)
            .animate("y", currentY - distance, currentY, duration, Tween.EASE_OUT);
    }
    
    /**
     * 从下方滑入
     */
    public static UIAnimator slideInFromBottom(UIAnimatable target, float distance, float duration) {
        float currentY = target.getAnimatedValue("y");
        return new UIAnimator(target)
            .animate("y", currentY + distance, currentY, duration, Tween.EASE_OUT);
    }
    
    /**
     * 向左滑出
     */
    public static UIAnimator slideOutToLeft(UIAnimatable target, float distance, float duration) {
        float currentX = target.getAnimatedValue("x");
        return new UIAnimator(target)
            .animate("x", currentX, currentX - distance, duration, Tween.EASE_IN);
    }
    
    /**
     * 向右滑出
     */
    public static UIAnimator slideOutToRight(UIAnimatable target, float distance, float duration) {
        float currentX = target.getAnimatedValue("x");
        return new UIAnimator(target)
            .animate("x", currentX, currentX + distance, duration, Tween.EASE_IN);
    }
    
    // ==================== 缩放动画 ====================
    
    /**
     * 缩放入场动画
     * 
     * @param target 动画目标
     * @param duration 持续时间（秒）
     * @return UI动画器
     */
    public static UIAnimator scaleIn(UIAnimatable target, float duration) {
        return new UIAnimator(target)
            .animate("scaleX", 0f, 1f, duration, Tween.OVERSHOOT)
            .animate("scaleY", 0f, 1f, duration, Tween.OVERSHOOT);
    }
    
    /**
     * 缩放退场动画
     */
    public static UIAnimator scaleOut(UIAnimatable target, float duration) {
        return new UIAnimator(target)
            .animate("scaleX", 1f, 0f, duration, Tween.EASE_IN)
            .animate("scaleY", 1f, 0f, duration, Tween.EASE_IN);
    }
    
    /**
     * 脉冲效果（放大后恢复）
     * 
     * @param target 动画目标
     * @param maxScale 最大缩放比例
     * @param duration 持续时间（秒）
     * @return UI动画器
     */
    public static UIAnimator pulse(UIAnimatable target, float maxScale, float duration) {
        return new UIAnimator(target)
            .animate("scaleX", 1f, maxScale, duration / 2, Tween.EASE_OUT)
            .animate("scaleY", 1f, maxScale, duration / 2, Tween.EASE_OUT)
            .setRepeatCount(1); // 来回播放一次
    }
    
    // ==================== 弹跳和震动效果 ====================
    
    /**
     * 弹跳入场动画
     */
    public static UIAnimator bounceIn(UIAnimatable target, float duration) {
        return new UIAnimator(target)
            .animate("scaleX", 0f, 1f, duration, Tween.BOUNCE)
            .animate("scaleY", 0f, 1f, duration, Tween.BOUNCE)
            .animate("alpha", 0f, 1f, duration * 0.6f, Tween.EASE_OUT);
    }
    
    /**
     * 震动效果
     * 
     * @param target 动画目标
     * @param intensity 震动强度
     * @param duration 持续时间（秒）
     * @return UI动画器
     */
    public static UIAnimator shake(UIAnimatable target, float intensity, float duration) {
        float currentX = target.getAnimatedValue("x");
        return new UIAnimator(target)
            .animate("x", currentX, currentX + intensity, duration / 4, Tween.LINEAR)
            .setRepeatCount(3); // 震动4次
    }
    
    // ==================== 旋转动画 ====================
    
    /**
     * 旋转动画
     * 
     * @param target 动画目标
     * @param fromAngle 起始角度
     * @param toAngle 结束角度
     * @param duration 持续时间（秒）
     * @return UI动画器
     */
    public static UIAnimator rotate(UIAnimatable target, float fromAngle, float toAngle, float duration) {
        return new UIAnimator(target)
            .animate("rotation", fromAngle, toAngle, duration, Tween.LINEAR);
    }
    
    /**
     * 连续旋转动画（无限循环）
     */
    public static UIAnimator spin(UIAnimatable target, float duration) {
        return new UIAnimator(target)
            .animate("rotation", 0f, 360f, duration, Tween.LINEAR)
            .setRepeatCount(-1); // 无限重复
    }
    
    // ==================== 组合动画预设 ====================
    
    /**
     * 按钮点击反馈动画
     * 
     * @param target 按钮目标
     * @return 动画集合
     */
    public static AnimationSet buttonClickFeedback(UIAnimatable target) {
        // 缩小 + 恢复的点击反馈
        UIAnimator scaleDown = new UIAnimator(target)
            .animate("scaleX", 1f, 0.9f, 0.1f, Tween.EASE_OUT)
            .animate("scaleY", 1f, 0.9f, 0.1f, Tween.EASE_OUT);
            
        UIAnimator scaleUp = new UIAnimator(target)
            .animate("scaleX", 0.9f, 1f, 0.1f, Tween.OVERSHOOT)
            .animate("scaleY", 0.9f, 1f, 0.1f, Tween.OVERSHOOT);
            
        return new AnimationSet(AnimationSet.SEQUENTIALLY)
            .addAnimation(scaleDown)
            .addAnimation(scaleUp);
    }
    
    /**
     * 菜单弹出动画
     * 
     * @param target 菜单目标
     * @return 动画集合
     */
    public static AnimationSet menuPopIn(UIAnimatable target) {
        UIAnimator fadeIn = fadeIn(target, 0.3f);
        UIAnimator scaleIn = scaleIn(target, 0.4f);
        
        return new AnimationSet(AnimationSet.TOGETHER)
            .addAnimation(fadeIn)
            .addAnimation(scaleIn);
    }
    
    /**
     * 菜单收起动画
     */
    public static AnimationSet menuPopOut(UIAnimatable target) {
        UIAnimator fadeOut = fadeOut(target, 0.2f);
        UIAnimator scaleOut = scaleOut(target, 0.3f);
        
        return new AnimationSet(AnimationSet.TOGETHER)
            .addAnimation(fadeOut)
            .addAnimation(scaleOut);
    }
    
    /**
     * 页面过渡动画（当前页面退出 + 新页面进入）
     * 
     * @param currentPage 当前页面
     * @param newPage 新页面
     * @return 动画集合
     */
    public static AnimationSet pageTransition(UIAnimatable currentPage, UIAnimatable newPage) {
        // 当前页面淡出 + 向左滑动
        UIAnimator currentFadeOut = fadeOut(currentPage, 0.3f);
        UIAnimator currentSlideOut = slideOutToLeft(currentPage, 200f, 0.3f);
        
        // 新页面从右侧滑入 + 淡入
        UIAnimator newSlideIn = slideInFromRight(newPage, 200f, 0.3f);
        UIAnimator newFadeIn = fadeIn(newPage, 0.3f);
        
        // 创建一个总的动画集合，包含所有动画
        return new AnimationSet(AnimationSet.TOGETHER)
            .addAnimation(currentFadeOut)
            .addAnimation(currentSlideOut)
            .addAnimation(newSlideIn)
            .addAnimation(newFadeIn);
    }
    
    // ==================== 便捷创建方法 ====================
    
    /**
     * 创建简单属性动画
     * 
     * @param target 动画目标
     * @param property 属性名称
     * @param startValue 起始值
     * @param endValue 结束值
     * @param duration 持续时间
     * @param interpolationType 插值类型
     * @return UI动画器
     */
    public static UIAnimator animate(UIAnimatable target, String property, 
                                   float startValue, float endValue, 
                                   float duration, int interpolationType) {
        return new UIAnimator(target)
            .animate(property, startValue, endValue, duration, interpolationType);
    }
    
    /**
     * 创建延迟动画
     * 
     * @param animator 原动画器
     * @param delay 延迟时间（秒）
     * @return 延迟后的动画器
     */
    public static UIAnimator delay(UIAnimator animator, float delay) {
        return animator.setStartDelay(delay);
    }
}